package com.example.common;

import org.apache.commons.lang.StringUtils;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * @author yuzhong
 * @date 2018-01-16 8:01 PM
 */
public class IdCardUtil {

    /** 中国公民身份证号码最小长度。 */
    public  final int CHINA_ID_MIN_LENGTH = 15;

    /** 中国公民身份证号码最大长度。 */
    public  final int CHINA_ID_MAX_LENGTH = 18;

    /**
     * 根据身份编号获取年龄
     *
     * @param idCard
     *            身份编号
     * @return 年龄
     */
    public static int getAgeByIdCard(String idCard) {
        int iAge = 0;
        Calendar cal = Calendar.getInstance();
        String year = idCard.substring(6, 10);
        int iCurrYear = cal.get(Calendar.YEAR);
        iAge = iCurrYear - Integer.valueOf(year);
        return iAge;
    }

    /**
     * 根据身份编号获取生日
     *
     * @param idCard 身份编号
     * @return 生日(yyyyMMdd)
     */
    public static String getBirthByIdCard(String idCard) {
        return idCard.substring(6, 14);
    }

    /**
     * 根据身份编号获取生日年
     *
     * @param idCard 身份编号
     * @return 生日(yyyy)
     */
    public static Short getYearByIdCard(String idCard) {
        return Short.valueOf(idCard.substring(6, 10));
    }

    /**
     * 根据身份编号获取生日月
     *
     * @param idCard
     *            身份编号
     * @return 生日(MM)
     */
    public static Short getMonthByIdCard(String idCard) {
        return Short.valueOf(idCard.substring(10, 12));
    }

    /**
     * 根据身份编号获取生日天
     *
     * @param idCard
     *            身份编号
     * @return 生日(dd)
     */
    public static Short getDateByIdCard(String idCard) {
        return Short.valueOf(idCard.substring(12, 14));
    }

    /**
     * 根据身份编号获取性别
     *
     * @param idCard 身份编号
     * @return 性别(M-男，F-女，N-未知)
     */
    public static String getGenderByIdCard(String idCard) {
        String sGender = "未知";
        if (StringUtils.isEmpty(idCard) || idCard.length() < 18) {
            return sGender;
        }

        String sCardNum = idCard.substring(16, 17);
        if (Integer.parseInt(sCardNum) % 2 != 0) {
            sGender = "男";//男
        } else {
            sGender = "女";//女
        }
        return sGender;
    }

    /**
     * 根据身份证编号获取年月日字符串
     *
     * @param idCard
     * @return
     */
    public static String getBirthStrByIdCard(String idCard) {
        if (StringUtils.isEmpty(idCard) || idCard.length() < 18) {
            return "未知";
        }
        Short nian=getYearByIdCard(idCard);
        Short yue=getMonthByIdCard(idCard);
        Short ri=getDateByIdCard(idCard);
        return nian+"年"+yue+"月"+ri+"日";
    }

    public static void main(String[] args) {
        String idcard="460200199209275127";
        String sex= getGenderByIdCard(idcard);
        System.out.println("性别:" + sex);
        int age= getAgeByIdCard(idcard);
        System.out.println("年龄:" + age);
        Short nian=getYearByIdCard(idcard);
        Short yue=getMonthByIdCard(idcard);
        Short ri=getDateByIdCard(idcard);
        System.out.println(getBirthByIdCard(idcard));
        System.out.print(nian+"年"+yue+"月"+ri+"日");
    }

    public static int getIdNoAge(String idNo) {
        int age = 0;
        String dates = null;
        SimpleDateFormat df = new SimpleDateFormat("yyyy");
        String year = df.format(new Date());
        if (idNo.length() == 18) {
            dates = idNo.substring(6, 10);
            age = Integer.parseInt(year) - Integer.parseInt(dates);
        } else {
            StringBuilder sb = new StringBuilder();
            sb.append("19").append(idNo.substring(6, 8));
            dates = sb.toString();
            age = Integer.parseInt(year) - Integer.parseInt(dates);
        }
        return age;
    }

}

